/**
 * 格式化文本
 */
export default {
  /**
   * 格式化电话号码
   * @param str 电话号码
   * @param type 类型：0是格式化，1是还原
   * @param tag 分隔符
   */
  tel({str, type = 0, tag = ' '}) {
    if (!str) {
      return str;
    }
    str = str.toString();

    if (type === 0) {
      str = str.replace(/[^0-9]/g, '');
      return str.replace(/(^.{3}|.{4})(?=.)/g, '$1' + tag);
    } else {
      let re = new RegExp(tag, 'g');
      return str.replace(re, '');
    }
  },
  /**
   * 格式化金额
   * @param str 电话号码
   * @param type 类型：0是格式化，1是还原
   * @param pre 前缀
   * @param tag 分隔符
   */
  money({str, type = 0, pre = '$', tag = ','}) {
    if (!str) {
      return str;
    }
    str = str.toString();

    if (type === 0) {
      str = pre ? pre + ' ' + str : str;
      //\B是非单词边界。边界是指两个字符的中间位置。x(?=y)匹配'x'仅仅当'x'后面跟着'y'；x(?!y)匹配'x'仅仅当'x'后面不跟着'y'。
      return str.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
    } else {
      let re = new RegExp('\\' + pre + '\\s?|(' + tag + '*)', 'g');
      return str.replace(re, '');
    }
  },
  /**
   * 格式化银行卡号
   * @param str 银行卡号
   * @param type 类型：0是格式化，1是还原
   * @param tag 分隔符
   */
  bank({str, type = 0, tag = ' '}) {
    if (!str) {
      return str;
    }
    str = str.toString();
    if (type === 0) {
      //'$1'代表第一个子表达式。
      return str.replace(/(\w{4})\B/g, '$1' + tag);
    } else {
      let re = new RegExp(tag, 'g');
      return str.replace(re, '');
    }
  },
  /**
   * 正则表达式校验规则
   * 默认：前后的空格不做校验：\s*
   * 官方文档：https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions
   */
  rules: {
    //手机号：参考http://www.sohu.com/a/163187581_283658
    mobile: {
      pattern: /^\s*1(((3|4|5|7|8|70)[0-9])|(66|98|99|410|440))\d{8}\s*$/,
      message: '请输入11或12位以1开头的数字'
    },
    //邮箱：支持字母、数字、减号、下划线、点号、@，必须以字母数字开头、包含@
    email: {
      pattern: /^\s*[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z]{2,4}\s*$/,
      message: '请输入以字母数字开头包含@的邮箱'
    },
    //短信验证码：6位数字
    codeMsg: {pattern: /^\s*\d{6}\s*$/, message: '请输入6位数字'},
    //图形验证码：4位字母数字
    codeImg: {pattern: /^\s*[A-Za-z\d]{4}\s*$/, message: '请输入4位字母数字'},
    //密码：8到20位字符：字母、数字、下划线、减号和!@#￥%&*
    password: {
      pattern: /^\s*([\w-!@#$%&*]){8,20}\s*$/,
      message: '请输入8到20位字符：字母、数字、下划线、减号和!@#￥%&*'
    },
    //1-20位中文
    rule1: {pattern: /^\s*[\u4e00-\u9fa5]{1,20}\s*$/, message: '请输入1-20位中文'},
    //0-10位数字
    rule2: {pattern: /^\s*\d{0,10}\s*$/, message: '请输入0-10位数字'},
    //1-100的整数
    rule3: {pattern: /^\s*(([1-9]\d?)|100)\s*$/, message: '请输入1-100的整数'},
    //1-多位字母、数字、下划线、减号
    rule4: {pattern: /^\s*[\w-]+\s*$/, message: '请输入1-多位字母、数字、下划线、减号'},
    //不允许输入空格
    rule5: {pattern: /^[^\s]*$/, message: '不允许输入空格'}
  },
  /**
   * 校验文本格式
   * 注意：目前没有完全统一的校验规则，以下只做参考，需要根据实际情况修改
   * @param type 类型，对应rules的类型
   * @param text 需要校验的文本
   */
  checkType(type, text) {
    let reg = this.rules[type];
    return reg.pattern && reg.pattern.test(text);
  }
};
